package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.dto.SetmealDTO;
import com.sky.dto.SetmealPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.SetmealDish;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.exception.SetmealEnableFailedException;
import com.sky.mapper.CategoryMapper;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetMealDishMapper;
import com.sky.mapper.SetMealMapper;
import com.sky.service.SetMealService;
import com.sky.vo.DishItemVO;
import com.sky.vo.SetmealVO;
import jdk.net.SocketFlow;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Set;

@Service
@Slf4j
public class SetMealServiceImpl implements SetMealService
{
    @Autowired
    private SetMealMapper setMealMapper;
    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private SetMealDishMapper setMealDishMapper;
    @Autowired
    private DishMapper dishMapper;

    @Override
    public void save(SetmealDTO setmealDTO) {
        System.out.println("*************");
        System.out.println("setmealDTO:"+setmealDTO);
        Setmeal setmeal = new Setmeal();
        BeanUtils.copyProperties(setmealDTO,setmeal);
        System.out.println("看一下:"+setmeal);
        setMealMapper.save(setmeal);//往套餐表保存信息

        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
        for(SetmealDish setmealDish:setmealDishes )
        {
           setmealDish.setSetmealId(setmeal.getId());//为每一个套餐菜品对象保存当前套餐的主键id
        }
        //往套餐菜品表保存信息
        setMealDishMapper.insertBatch(setmealDTO.getSetmealDishes());


//        //老师的
//        Long setmealId = setmeal.getId();
//
//        List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
//        setmealDishes.forEach(setmealDish -> {
//            setmealDish.setSetmealId(setmealId);
//        });
//
//        //保存套餐和菜品的关联关系
//        setMealDishMapper.insertBatch(setmealDishes);
    }

    @Override
    public Page<SetmealVO> page(SetmealPageQueryDTO setmealPageQueryDTO)
    {
        PageHelper.startPage(setmealPageQueryDTO.getPage(),setmealPageQueryDTO.getPageSize());
        Page<SetmealVO> page =setMealMapper.page(setmealPageQueryDTO);


        return page;

    }

    @Override
    public void startOrStop(Integer status, Long id) {

        //启售套餐时候，如果该套餐有停售菜品，就无法启售。并提示套餐内有未启售菜品，无法启售
        if(status== StatusConstant.ENABLE)
        {
            //根据套餐id查询套餐菜品表，拿到对应套餐的菜品id
            List<SetmealDish> setmealDishes = setMealDishMapper.SelectBySetmealId(id);
            //查询菜品表遍历，看这些菜品id对应的status是否等于0
            if(setmealDishes!=null && setmealDishes.size()>0)
            {
                for(SetmealDish setmealDish : setmealDishes)
                {
                    Long dishId = setmealDish.getDishId();
                    Dish dish = dishMapper.getById(dishId);
                    if(dish.getStatus()==StatusConstant.DISABLE)
                    {
                        throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
                    }
                }
            }



        }
        Setmeal setmeal = Setmeal.builder()//我要进行公共字段填充，默认要给形参第一个对象的修改和创建人赋值，肯定要穿一个包含这四个属性的对象
                .id(id)
                .status(status)
                .build();
        setMealMapper.startOrStop(setmeal);
    }

    @Override
    public SetmealVO getById(Long id)
    {
//        //查询套餐基本信息
//        setMealMapper.getById(id);
//        //要求返回分类名字，但是我在套餐表格有分类id，所以要查分类名字（分类表）
////        categoryMapper.getById()
//        //要求返回套餐菜品，需要查套餐菜品表（套餐菜品关系表）
//
//        setMealMapper.getById(id);
//    return null;
        SetmealVO setmealVO = new SetmealVO();
        List<SetmealDish> test=setMealDishMapper.SelectBySetmealId(id);//中间表的数据集合

//        log.info("遍历开始");
//        if(test!=null && test.size()>0)
//        {
//            //遍历一下test
//            for (SetmealDish setmealDish : test)
//            {
//                log.info("setmealDish{}",setmealDish);
//            }
//        }
//        log.info("遍历结束");
        SetmealVO setmealvo = setMealMapper.getBySetmealId(id);//因为管理端写了分类的id和名字要必须返回，我就直接在返回值填写了setmealvo类型而不是setmeal类型

        BeanUtils.copyProperties(setmealvo,setmealVO);;//套餐表的基本信息 提前搞，要不然会覆盖
        setmealVO.setSetmealDishes(test);//套餐菜品表的基本信息
//        log.info("遍历开始1");
//        //遍历得到的集合
//        for (SetmealDish setmealDish : setmealVO.getSetmealDishes())
//        {
//            log.info("setmealDish：{}",setmealDish);
//        }
//        log.info("遍历结束1");



//        log.info("遍历开始2");
//        //遍历得到的集合
//        for (SetmealDish setmealDish : setmealVO.getSetmealDishes())
//        {
//            log.info("setmealDish：{}",setmealDish);
//        }
//        log.info("遍历结束2");

        setmealVO.setCategoryId(setMealMapper.getCategoryId(id));//拿到分类id
//        log.info("分类id:{}",setMealMapper.getCategoryId(id));

        setmealVO.setCategoryName(setMealMapper.getCategoryName(id));//拿到分类名字
//        log.info("分类名字:{}",setMealMapper.getCategoryName(id));



        log.info("setmealVO{}",setmealVO);

        return setmealVO;

    }

    @Transactional
    @Override
    public void deleteBatch(List<Long> ids)
    {
        //启售中的套餐不能删除
        //思路：根据套餐id查询套餐表，根据status字段说明启售中的套餐不能删除
        for (Long id : ids)
        {
          SetmealVO setmealVO = setMealMapper.getBySetmealId(id);
          if(setmealVO.getStatus()==StatusConstant.ENABLE)
          {
              throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
          }
        }

      setMealMapper.deleteBySetmealIds(ids);
      setMealDishMapper.deleteBySetmealIds(ids);
    }

   @Transactional
    @Override
    public void update(SetmealDTO setmealDTO)
    {
        Setmeal setmeal =new Setmeal();
        BeanUtils.copyProperties(setmealDTO,setmeal);
        setMealMapper.update(setmeal);//套餐的基本信息就是直接修改了
//        System.out.println("************************");
//        setMealDishMapper.update(setmealDTO);//但是这里面提供的是套餐菜品的集合，所以要先把之前的删除了，再新增
        //根据套餐id删除本套餐所有菜品(套餐菜品表)
         setMealDishMapper.deleteBySetmealId(setmealDTO.getId());
        //遍历集合，进行插入（套餐菜品表）
        for (SetmealDish setmealDish : setmealDTO.getSetmealDishes())
        {
            setmealDish.setId(setmealDTO.getId());//前端没有给中间表的每条数据（对象）的套餐id赋值，所以要手动赋值
        }
        System.out.println("************************");
        setMealDishMapper.insertBatch(setmealDTO.getSetmealDishes());
    }

    @Override
    /**
     * 条件查询
     * @param setmeal
     * @return
     */
    public List<Setmeal> list(Setmeal setmeal) {
        List<Setmeal> list = setMealMapper.list(setmeal);
        return list;
    }

    /**
     * 根据id查询菜品选项
     * @param id
     * @return
     */
    public List<DishItemVO> getDishItemById(Long id) {
        return setMealMapper.getDishItemBySetmealId(id);
    }
}
